package jdk.proxy;

import sun.applet.Main;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

/**
 * @author wang fei
 * @date 2020-10-11 11:47
 */
public class JdkProxy {
    public static void main(String[] args) {

        /**
         *newProxyInstance三个参数
         * 第一个类加载器
         * 第二个接口，可以是多个[类型是数组]
         * 第三个实现InvocationHandler接口，创建代理对象，写增强的部分
         */
        //类加载器
        Class [] aClass = {UserDao.class};
        UserDaoImpl userDao = new UserDaoImpl();
        //创建接口实现类的代理对象
        UserDao dao = (UserDao) Proxy.newProxyInstance(JdkProxy.class.getClassLoader(), aClass, new UserDaoProxy(userDao));
        int result = dao.add(1,2);
        System.out.println("result:" + result);
    }
}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler{
    private  Object obj;

    public UserDaoProxy(Object obj){
        this.obj = obj;
    }

    //增强方法。
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //方法之前
        System.out.println("方法执行之前>>>" + method.getName()+ "传递的参数:" + Arrays.toString(args));

        //被增强的方法
        Object res = method.invoke(obj, args);

        //方法之后

        System.out.println("方法执行之后:" + obj);

        return res;
    }
}
